

'''
1. 通过调用配置层中的代码获取用例文件中的接口信息；
2. 通过遍历接口列表的每一个接口信息，然后通过判断每一个接口信息的请求方式，根据不同的请求方式调用
   requests对象的不同请求方法。
3. 请求完成后，将响应信息中响应状态码和预期结果以及实际响应报文信息进行判定，得出接口测试结果。
   (响应状态码为: 200 响应报文信息和预期结果的相似度达到匹配要求)
4. 将接口响应信息以及测试判定结果存入列表中。
5. 将列表中的信息调用配置层中封装的写入用例方法将测试结果和响应信息写入到用例文件中。
'''
import allure
import pytest
from setting_floor import excel_setting,requests_setting;
import difflib;
from logs_floor import logs_file;

#通过调用日志层的日志文件中封装的方法获取到日志对象
log_info = logs_file.get_log_pro();

case_file_url = r"C:\Users\Administrator\Desktop\LOL项目接口测试用例.xls";
'''
方法: 根据传入方法的用例文件路径和sheet名称对接口信息进行测试

参数信息: 用例文件的路径    sheet名称

返回值: 无

'''
@allure.epic("LOL项目")

@pytest.mark.parametrize("sheet_name",excel_setting.get_casefile_sheets(case_file_url))
def test_case_inter(sheet_name):
    allure.dynamic.feature(sheet_name)
    emp_jk_list = excel_setting.readCaseToInetr(case_file_url,sheet_name);

    #定义一个列表用于存储接口的响应报文信息
    resp_text_list = [];
    #定义一个列表用于存储接口的测试结果
    result_list = [];

    for i in emp_jk_list:
        allure.dynamic.story(i.get("inter_name"))
        #i = {'inter_name': '新增员工信息', 'inter_url': 'http://127.0.0.1:8080/lol/servlet/emp', 'inter_method': 'post', 'inter_params': '{"method":"addWorker","workerCode":"zq-001","workerName":"张三","workerDept":"技术部","workerPrice":"5000"}', 'inter_think': '[{"message":"新增成功","员工编号":"zq-001","员工名称":"张三","员工部门":"技术部","员工薪资":"5000"}]'}
        #通过调用requests对象进行接口请求  因为接口的请求方式不同，所以需要进行判断
        result = requests_setting.requests_plus(i.get("inter_method"),i.get("inter_url"),i.get("inter_params"))

        #requests对象返回的接口响应体中包含了(响应的状态码，响应报文信息，响应的头信息等)
        #根据接口测试返回的响应体中的信息进行判定接口是否测试通过
        #接口响应状态码:200   响应报文信息符合接口业务要求
        #python中的difflib对象可以返回两个字符串之间的相似度
        #当接口的响应状态码为200，并且接口测试后响应的报文信息和预期结果匹配度达到要求，则证明接口测试通过

        if result.status_code == 200 and difflib.SequenceMatcher(None,i.get("inter_think"),result.text).ratio() > 0.8:

            print(i.get("inter_name")+"接口测试通过");
            #将接口的报文信息存入列表中
            resp_text_list.append(result.text)
            result_list.append("√");
            log_info.info(i.get("inter_name")+"接口测试通过");

        else:

            print(i.get("inter_name")+"接口测试失败");
            resp_text_list.append(result.text)
            result_list.append("×");
            log_info.error(i.get("inter_name")+"接口测试失败");

    #当所有的接口测试完毕后，两个列表中分别存放的是响应报文信息和测试结果
    excel_setting.writeCaseResult(case_file_url,sheet_name,resp_text_list,result_list)


